<?php

/***********************************************/
/*TITULO */
/***********************************************/
echo" <div class=\"pag_content\">
 	<div class=\"pag_content_title\">
		<div class=\"pag_title_cap\">Cap&iacute;tulo 5: </div>
		<div class=\"pag_title_cont\">	Servidor Compartido</div>
    </div>
    <div class=\"pag_content_body\">         
	<div class=\"contenido_principal\">	
		<br />";
/***********************************************/
/*TITULO PARRAFO */
/***********************************************/
echo "
	<div class=\"parrafo_titulo\">
		Configura servidor dedicado
	</div>";

/***********************************************/
/*CONTENIDO*/
/***********************************************/
echo "	

	<div class=\"parrafo\" align=\"justify\">
	&nbsp;&nbsp;Previamente tenemos que modificar algunos parametros en el fichero de inicializacion:
	<br/>	
a)	DISPATCHER: indica el n&uacute;mero de dispatchers que se van a ejecutar al iniciar la instancia. Se pueden a&ntilde;adir dispatchers de forma dinamica utilizando ALTER SYSTEM.
El parametro DISPATCHER se puede completar con algunos atributos:

 <div class=\"parrafo_lista_sub\">
-- ADDRESS: indica la direccion donde el dispatcher esta escuchando.<br />
-- CONNECTIOS: m&aacute;ximo n&uacute;mero de conexiones por dispatcher.<br />
-- PROTOCOL: protocolo de comunicacion utilizado entre el dispatcher y el listener.<br />
-- SERVICE: nombre del servicio con el que el dispatcher se va a registrar con el listener.<br />
-- POOL: configura el dispatcher para gestionar de una forma m&aacute;s eficiente conexiones que se encuentrar inactivas. El valor ser&iacute;a ON. Junto con este parametro tambien tendriamos que configurar el parametro TICK donde cada unidad representa 10 minutos de inactividad.<br />
</div></div>
<div class=\"parrafo\" align=\"justify\">
Un ejemplo de este parametro ser&iacute;a:
</div>
<blockquote><i>DISPATCHER=\"(PROTOCOL=TCP)(DISPATCHER=2)\" </i></blockquote>
<br/>
<div class=\"parrafo\" align=\"justify\">
o de forma din&aacute;mica:
</div>
<blockquote><i>ALTER SYSTEM SET DISPATCHERS=\"(PRO=TCP)(DIS=2)\";</i></blockquote>
<br/>
<div class=\"parrafo\" align=\"justify\">
En el ejemplo se estan configurando dos dispatcher utilizando el protocolo TCP.
</div>
<div class=\"parrafo\" align=\"justify\">
&nbsp;&nbsp;Para calcular el numero de dispatcher que debemos arrancar en nuestro servidor debemos conocer el numer de conexiones maximas que nos limita nuestro sistema operativo y el numero de conexiones maximas que podemos encontrar en nuestra base de datos.
</div>
<div class=\"parrafo\" align=\"justify\">
&nbsp;&nbsp;La vista dinamica V$SESSION nos aporta informaci&oacute;n de las conexiones establecidas en nuestra base de datos.
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; select sid,serial#,username,server,program from v\$session

	SID        SERIAL#  USERNAME   SERVER     PROGRAM
	--------- --------- ---------- --------- ---------------
	7          13       SCOTT      DEDICATED SQLPLUS.EXE
	8          12       SCOTT      DEDICATED SQLPLUS.EXE
	9          4        SYSTEM     DEDICATED SQLPLUS.EXE
</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
b)	SHARED_SERVERS: Indica el n&uacute;mero minimo de procesos de servidor que se van a arrancar con la instancia.
</div>
<blockquote><i>ALTER SYSTEM SET SHARED_SERVERS=3;</i></blockquote>
<br/>
<div class=\"parrafo\" align=\"justify\">
c)	SHARED_SERVERS_SESSIONS: Indica el n&uacute;mero m&aacute;ximo de sesiones que se van a aceptar. Si se sobrepasa este numero al siguiente intento de conexi&oacute;n se obtendra un ORA-00018.
</div>
<h3>GESTION SERVIDOR COMPARTIDO</h3>
<div class=\"parrafo\" align=\"justify\">
La informacion de las conexiones establecidas y de la carga de los dispatcher nos la proporciona el listener:
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>&gt; c:\..\bin>lsnrctl services

	LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 21-APR-2004
	20:50:35
	Copyright (c) 1991, 2004, Oracle. All rights reserved.
	Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MJW01)
	(PORT=1521)))
	Services Summary...
	Service \"PLSExtProc\" has 1 instance(s).
	Instance \"PLSExtProc\", status UNKNOWN, has 1 handler(s) for this service...
	Handler(s):
	\"DEDICATED\" established:0 refused:0
	LOCAL SERVER
	Instance \"MJW\", status READY, has 3 handler(s) for this service...
	Handler(s):
	\"DEDICATED\" established:0 refused:0 state:ready
	LOCAL SERVER
	\"D001\" established:11 refused:1 current:1 max:1002 state:ready
	DISPATCHER machine: MJW01, pid: 504
	(ADDRESS=(PROTOCOL=tcp)(HOST=MJW01)
	(PORT=4152))
	\"D000\" established:15 refused:3 current:2 max:1002 state:ready
	DISPATCHER machine: MJW01, pid: 3846
	(ADDRESS=(PROTOCOL=tcp)(HOST=MJW01)
	(PORT=3845))
	The command completed successfully

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
De este ejemplo podemos obtener que en esta instancia estan corriendo dos dispatcher donde D001 esta atendiendo una conexion y D000 esta atendiendo dos conexiones. Aparte aporta informaci&oacute;n del numero de conexiones que han sido rechazadas.
</div>
<div class=\"parrafo\" align=\"justify\">
Tambien podemos consultar algunas vistas din&aacute;micas que nos proporcionan informaci&oacute;n de los dispatcher que tenemos configurados en nuestra base de datos:
<br /><br />
- V\$DISPATCHER
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; select name,status,messages,idle,busy,bytes,breaks from v\$dispatcher

	NAME STATUS MESSAGES  IDLE    BUSY BYTES BREAKS
	---- ------ --------- ------- ---- ------ ------
	D000 WAIT   168       389645  108  12435  0
	D001 WAIT   94        389668  48   6940   0

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
Aporta informacion sobre el numero de dispatcher, el estado en el que se encuentran, WAIT indica que estan esperando nuevas conexiones IDLE y BUSY indican en centenares de segundos el tiempo que han pasado en ese estado. BYTES y MESSAGES indica el numero de bytes o mensajes procesados desde que se inicio la instancia.
<br /><br />
-V\$DISPATCHER_CONFIG
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; select conf_indx,dispatchers,connections,sessions \"SESS\",service
	 from v\$dispatcher_config
	 where network like '%TCP%'

	CONF_INDX DISPATCHERS CONNECTIONS SESS   SERVICE
	--------- ----------- ----------- ------ -------
	0         3           1002        1002   orcl
	
</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
Nos aporta informaci&oacute;n de la configuracion del listener.
<br /><br />
-V\$DISPATCHER_RATE
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt;select name,cur_event_rate,cur_msg_rate, cur_svr_byte_rate from v\$dispatcher_rate

	NAME CUR_EVENT_RATE CUR_MSG_RATE CUR_SVR_BYTE_RATE
	---- -------------- ------------ -----------------
	D000 5300           4            0  
	D001 5205           3            0 

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
Aporta informacion estadistica de los dispatcher, por ejemplo CUR_EVENT_RATE indica el numero de peticiones por minuto (5,300 en D000 y 5,205 en D001). CUR_MSG_RATE muestra lo rapido que el dispatcher manda las peticiones del cliente al proceso servidor. Las unidades de CUR_EVENT_RATE son eventos por minuto, mientras que la de CUR_MSG_RATE son las de mensajes por segundo.
<br /><br />
-V\$QUEUE
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; select * from v\$queue;

	PADDR    TYPE       QUEUED    WAIT      TOTALQ
	-------- ---------- --------- --------- ---------
	00       COMMON     0         0         152
	03C6C244 DISPATCHER 0         0         91
	03C6C534 DISPATCHER 0         0         71

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
Aporta informacion del estado de la cola de peticiones y de las colas de respuestas.
<br /><br />
-V\$SHARED_SERVER
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; select name,status,messages,bytes,idle,busy,requests from v\$shared_server;

	NAME STATUS MESSAGES BYTES IDLE BUSY REQUESTS
	---- ------ -------- ----- ----- ---- --------
	S000 EXEC   372      86939 98472 300  175
	S001 EXEC   26       9851  98703 38   13

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
Aporta informacion del numero de peticiones procesadas y de la cantidad de bytes procesados por el servidor compartido. S001 y S000 son los servidores compartidos, EXEC significa que actualmente se encuentra procesando una peticion.
<br /><br />
En este ejemplo vemos que S000 ha procesado muchos mas mensajes que S001, esto es debido aque S000 esta el primero en la sita de servidores y unicamente mandaran un mensaje a S001 cuando S000 no pueda procesarlo.
</div>
<h3>PETICION DE UNA CONEXION DEDICADA EN UN SERVIDOR COMPARTIDO</h3>
<div class=\"parrafo\" align=\"justify\">
Hemos comentado que las conexiones a traves de servidores compartidos no permiten ciertas tareas de administracion. Para poder realizar una conexion dedicada tendremos que modificar el tnsnames.ora del cliente:
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p># tnsnames.ora Network Configuration File:
# C:\\oracle\\product\\10.1.0\\db_1\\network\\admin\\tnsnames.ora

	ORCL =
	(DESCRIPTION =
	(ADDRESS = (PROTOCOL = TCP)(HOST = MJW01)(PORT = 1521))
	(CONNECT_DATA =
	(SERVICE_NAME = orcl)
	(SRVR = DEDICATED) # Request a dedicated connection for DBA
	)
	)
	
</p></pre></blockquote>
<h3>CALCULAR EL NUMERO DE DISPATCHER NECESARIOS</h3>
<div class=\"parrafo\" align=\"justify\">
Ejecutaremos esta query para saber el porcentaje del tiempo en el que el dispatcher esta ocupado:
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; Select name, (busy / (busy + idle))*100\"Dispatcher % busy Rate\" From V\$DISPATCHER

Protocol Dispatcher % Busy Rate
------------        -------------
D000               .00070079
D001               .0059

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
Comprobamos que los dispatcher estan una porcentaje muy peque&ntilde;o de tiempo ocupados. Consideraremos que un dispatcher esta ocupado cuando este porcentaje supere el 50%. Entonces procederemos a a&ntilde;adir mas:
</div>
<blockquote><i>ALTER SYSTEM SET DISPATCHERS=\"(PRO=TCP)(DIS=4)\";</i></blockquote>
<br />
<h3>COMPROBAR CUANTO TIEMPO ESTAN ESPERANDO LOS CLIENTES A SER ATENDIDOS.</h3>
<div class=\"parrafo\" align=\"justify\">
Ejecutaremos esta query para saber el promedio en segundos que tiene que esperar un cliente a procesar su mensaje:
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; SELECT decode(sum(totalq),0,'No Responses',
	Sum(wait)/sum(totalq)) \"Average Wait time\"
	FROM V\$QUEUE q, V\$DISPATCHER d
	WHERE q.type = 'DISPATCHER'
	AND q.paddr = d.paddr;

Average Wait Time
------------------
.0413

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
El resultado indica que de media un cliente tiene que esperar 0.0413 segunos a ser atendido.
</div>
<h3>CALCULAR SI TENEMOS SUFICIENTES PROCESOS SERVIDOR.</h3>
<div class=\"parrafo\" align=\"justify\">
Para saber esto vamos a calcular cuanto tiempo se invierte en procesar una peticion de un cliente:
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; Select decode(totalq,0,'No Requests') \"Wait Time\",Wait/totalq || 'hundredths of seconds'
	\"Average Wait time per request\"	from V\$QUEUE	where type = 'COMMON'

Wait Time Average Wait time per request
-------- -----------------------------------
.023132 hundredths of a second.
</p></pre></blockquote>
";

/***********************************************/
/*PIE*/
/***********************************************/
echo"
	</div> 		 
    </div>
    <div class=\"pag_content_footer\">
    </div>
    <div class=\"pag_content_nav\">		
		<div class=\"pag_contenido_left\">
			<a  class=\"cap_next\" href=\"oca_main.php?cap=5&part=1\">	&lt; Anterior </a>
		 </div>
		<div class=\"pag_contenido_right\" align=\"right\">	
			<a  class=\"cap_next\" href=\"oca_main.php?cap=5&part=3\">	Cap&iacute;tulo 6 &gt;</a>
		 </div>
	</div>      
</div>
";

?>